package pe.gob.foncodes.ssa.bs.common.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


public class FechaUtil {

    public static final String FORMATO_FECHA_COMPLETO = "d MMM yyyy";
    public static final java.text.SimpleDateFormat FORMATO_FECHA = new java.text.SimpleDateFormat("dd/MM/yyyy");
    public static final java.text.SimpleDateFormat FORMATO_FECHA_ = new java.text.SimpleDateFormat("yyyyMMdd");
    public static final java.text.SimpleDateFormat FORMATO_FECHAHORA = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    public static final String SEPARADOR_FECHA = "/";
    public static final String SEPARADOR_HORA = ":";
    public static String mes;

    public static String toString(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    public static Object formatearFecha(Object poFecha) {
        String lsFechaFormateada = null;
        if (poFecha != null) {
            lsFechaFormateada = FORMATO_FECHA.format(poFecha);
        }
        return lsFechaFormateada;
    }

    public static Object formatearFecha_(Object poFecha) {
        String lsFechaFormateada = null;
        if (poFecha != null) {
            lsFechaFormateada = FORMATO_FECHA_.format(poFecha);
        }
        return lsFechaFormateada;
    }

    public static Object formatearFechaHora(Object poFecha) {
        String lsFechaFormateada = null;
        if (poFecha != null) {
            lsFechaFormateada = FORMATO_FECHAHORA.format(poFecha);
        }
        return lsFechaFormateada;
    }

    public static java.util.Date convertirStringAUtilDate(String fecha) {
        java.util.Date date = null;
        java.util.Date ldTemporal = null;
        try {
            ldTemporal = FORMATO_FECHAHORA.parse(fecha, new java.text.ParsePosition(0));
            if (ldTemporal == null) {
                date = FORMATO_FECHA.parse(fecha, new java.text.ParsePosition(0));
            } else {
                date = ldTemporal;
            }
        } catch (Exception e) {
            System.out.println("Error de Conversion de Fecha");
        }
        return date;
    }

    public static String obtenerStringDeFechayHoraActual() {
        StringBuffer sbFecha = null;
        java.util.Calendar cal = java.util.Calendar.getInstance();
        sbFecha = obtenerStringBufferDeFechayHoraActualPorCalendar(cal);
        return sbFecha.toString();
    }

    private static StringBuffer obtenerStringBufferDeFechayHoraActualPorCalendar(java.util.Calendar pCal) {
        StringBuffer sbFecha = new StringBuffer("");
        java.text.DecimalFormat df = new java.text.DecimalFormat("00");
        sbFecha.append(df.format(pCal.get(java.util.Calendar.DATE))).append(SEPARADOR_FECHA);
        sbFecha.append(df.format(pCal.get(java.util.Calendar.MONTH) + 1)).append(SEPARADOR_FECHA);
        sbFecha.append(Integer.toString(pCal.get(java.util.Calendar.YEAR))).append(" ");
        sbFecha.append(df.format(pCal.get(java.util.Calendar.HOUR_OF_DAY))).append(SEPARADOR_HORA);
        sbFecha.append(df.format(pCal.get(java.util.Calendar.MINUTE))).append(SEPARADOR_HORA);
        sbFecha.append(df.format(pCal.get(java.util.Calendar.SECOND)));
        return sbFecha;
    }

    public static java.util.Date obtenerUtilDateDeFechayHoraActual() {
        return convertirStringAUtilDate(obtenerStringDeFechayHoraActual());
    }

    public static java.util.Date agregarDiaPorUtilDateFechaHoraYCantidadDia(java.util.Date pFecha, int pCantidad) {
        java.util.Calendar cal = null;
        StringBuffer sbFecha = null;
        if (pFecha != null) {
            cal = java.util.Calendar.getInstance();
            cal.setTime(pFecha);
            cal.add(java.util.Calendar.DATE, pCantidad);
            sbFecha = obtenerStringBufferDeFechayHoraActualPorCalendar(cal);
            return convertirStringAUtilDate(sbFecha.toString());
        } else {
            return null;
        }
    }

    //El  mesElegido tiene que tener un formato de dos digitos.
    public static Date tipoDeFormatoStringDeFechaATipoDate(String anioElegido, String mesElegido) throws Exception {
        int totaldeDia = CalculaDias(Integer.parseInt(anioElegido), Integer.parseInt(mesElegido));
        java.util.Date anoMesDia;
        SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMdd");
        StringBuffer str = new StringBuffer(anioElegido);
        str.append(mesElegido);
        str.append("01");
        anoMesDia = formateador.parse(str.toString());
        return anoMesDia;
    }
    //El  mesElegido tiene que tener un formato de dos digitos - para fecha fin.

    public static Date tipoDeFormatoStringDeFechaFinATipoDate(String anioElegido, String mesElegido) throws Exception {
        int totaldeDia = CalculaDias(Integer.parseInt(anioElegido), Integer.parseInt(mesElegido));
        java.util.Date anoMesDia;
        SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMdd");
        StringBuffer str = new StringBuffer(anioElegido);
        str.append(mesElegido);
        int dia = CalculaDias(Integer.parseInt(anioElegido), Integer.parseInt(mesElegido));
        str.append(dia);
        anoMesDia = formateador.parse(str.toString());
        return anoMesDia;
    }

    public static Date tipoDeFormatoStringDeFechaATipoDateFechaFinal(String anioElegido, String mesElegido) throws Exception {
        int totaldeDia = CalculaDias(Integer.parseInt(anioElegido), Integer.parseInt(mesElegido));
        java.util.Date anoMesDia;
        SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMdd");
        StringBuffer str = new StringBuffer(anioElegido);
        str.append(mesElegido);
        str.append(totaldeDia);
        anoMesDia = formateador.parse(str.toString());
        return anoMesDia;
    }

    public static int CalculaDias(int a, int m) throws Exception {
        if ((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12) || (m == 13) || (m == 15) || (m == 17)) {
            return 31;
        } else if ((m == 4) || (m == 16) || (m == 6) || (m == 18) || (m == 9) || (m == 11)) {
            return 30;
        } else if ((m == 2) || (m == 14)) {
            if ((((a % 4) == 0) && ((a % 100)) != 100) || ((a % 400) == 0)) {
                return 29;
            }
            return 28;
        } else {
            return -1;
        }
    }

    public static String MostrarMeses(int i) {
        switch (i) {
            case 1:
                mes = "Ene";
                break;
            case 2:
                mes = "Feb";
                break;
            case 3:
                mes = "Mar";
                break;
            case 4:
                mes = "Abr";
                break;
            case 5:
                mes = "May";
                break;
            case 6:
                mes = "Jun";
                break;
            case 7:
                mes = "Jul";
                break;
            case 8:
                mes = "Ago";
                break;
            case 9:
                mes = "Set";
                break;
            case 10:
                mes = "Oct";
                break;
            case 11:
                mes = "Nov";
                break;
            case 12:
                mes = "Dic";
                break;
            default:
                mes = "";
        }
        return mes;
    }

    public static Date aDate(String strFecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy/MM/dd");
        Date fecha = null;

        try {
            fecha = formatoDelTexto.parse(strFecha);
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;


    }

    public static int fechasDiferenciaEnDias(Date fechaInicial, Date fechaFinal) {
        double dias = 0;
        try {
            DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
            String fechaInicioString = df.format(fechaInicial);
            fechaInicial = df.parse(fechaInicioString);
            String fechaFinalString = df.format(fechaFinal);
            fechaFinal = df.parse(fechaFinalString);
            long fechaInicialMs = fechaInicial.getTime();
            long fechaFinalMs = fechaFinal.getTime();
            long diferencia = fechaFinalMs - fechaInicialMs;
            dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ((int) dias);
    }
}
